/*
 * 教材中的示例程序之完整版.
 * 书名：《编译原理基础》
 * 版次：第三版
 * 作者：王献青，张立勇，张淑平，刘坚
 * 出版社：西安电子科技大学出版社
 * 程序完成时间：2025.03
 */

/*
 * 文件内容： 教材中的程序清单3.2， 即【例3.37】。
 * 该程序对输入中的字符、单词和行分别计数，
 * 它将单词看做是由空格、换行分隔的字符序列，
 */
%{
    int nchar = 0; // 记录字符个数，不包括空格和换行符
    int nword = 0; // 记录单词数
    int nline = 0; // 记录行数
%}

%%
[ ]                         // 匹配到一个空格，无动作(“吃掉”此空格)
\n      {   ++ nline;       // 匹配到一个换行符，行数加1
        }
[^ \n]+	{                   // 匹配到一个单词，单词数加1，字符数加单词长度
            ++ nword; nchar += yyleng;
        }
%%
int main()
{
    yylex();		// 调用词法分析器，直至输入结束
					// 最后打印字符数、单词数、行数
    printf("nchar=%d, nword=%d, nline=%d\n", nchar, nword, nline);
    return 0;
}

int yywrap() {
   return 1;
}
